package com.weng.bigdata.core.warehouse.utils;

import com.weng.bigdata.core.database.enums.DbTypeEnum;
import com.weng.bigdata.core.warehouse.enums.AllJdbcTypeEnum;
import com.weng.bigdata.core.warehouse.enums.HiveJdbcTypesEnum;
import com.weng.bigdata.core.warehouse.enums.ImpalaJdbcTypesEnum;
import com.weng.bigdata.core.warehouse.enums.MysqlJdbcTypesEnum;
import com.weng.framework.common.exception.GlobalServiceException;
import com.weng.framework.core.constants.ResultCodeEnum;
import org.apache.commons.lang3.StringUtils;

/**
 * 列  类型工具类
 * @author wengzhonghui
 * @date 2021/4/1 14:04
 */
public class JdbcTypeUtil {

		/**
		 * 把第三方数据库的JDBC类型转换为  目标数据库的JDBC类型
		 * @param sourceJdbcType 源Jdbc类型, sourceDbType 源数据库类型, targetDbType 目标数据库类型
		 * @return
		 */
		public static String sourceJdbcTypeConvertToTargetJdbcType(String sourceJdbcType, String sourceDbType, String targetDbType){
				if(sourceDbType.equalsIgnoreCase(targetDbType)){
						return sourceJdbcType;
				}
				return    standardToJdbcType(jdbcTypeToStandard(sourceJdbcType, sourceDbType), targetDbType);
		}


	/**
	 * 把不同数据库的字段类型，转成统一的标准值 见SQLType
	 * 如VARCHAR 转为 12
	 * @param jdbcType 字段类型如varchar, dbType数据库类型，见DbTypeEnum
	 * @return
	 */
	public static Integer jdbcTypeToStandard(String jdbcType, String dbType){
			if(StringUtils.isEmpty(dbType)){
					throw new GlobalServiceException(ResultCodeEnum.SERVICE_ERROR.getCode(), "数据库类型不能为空!");
			}
			if(StringUtils.isEmpty(jdbcType)){
					throw new GlobalServiceException(ResultCodeEnum.SERVICE_ERROR.getCode(), "jdbc类型为空!");
			}
			return AllJdbcTypeEnum.valueOf(jdbcType.replace(" ", "_").toUpperCase()).getVendorTypeNumber();
	}

		/**
		 * 转成统一的标准jdbc类型(见SQLType)，转化为不同数据库的字段类型，
		 * 如mysql 的12 转为 VARCHAR
		 * @param jdbcType 字段类型如varchar, targetDbType：目标数据库类型，见DbTypeEnum
		 * @return
		 */
		public static String standardToJdbcType(Integer jdbcType, String targetDbType){
				if(StringUtils.isEmpty(targetDbType)){
						throw new GlobalServiceException(ResultCodeEnum.SERVICE_ERROR.getCode(), "数据库不能为空!");
				}
				if(jdbcType == null){
						throw new GlobalServiceException(ResultCodeEnum.SERVICE_ERROR.getCode(), "jdbc类型为空!");
				}
				if(DbTypeEnum.MYSQL.getValue().equalsIgnoreCase(targetDbType)){
						return MysqlJdbcTypesEnum.valueOf(jdbcType).getValue();
				}else if(DbTypeEnum.HIVE.getValue().equalsIgnoreCase(targetDbType)){
						return HiveJdbcTypesEnum.valueOf(jdbcType).getValue();
				}else if(DbTypeEnum.IMPALA.getValue().equalsIgnoreCase(targetDbType)){
						return ImpalaJdbcTypesEnum.valueOf(jdbcType).getValue();
				}else{
						throw new GlobalServiceException(ResultCodeEnum.SERVICE_ERROR.getCode(), "尚未支持"+ targetDbType +"类型数据库的字段转换!");
				}
		}




}
